package com.newlink.building.main.ui

import android.app.Dialog
import android.content.Intent
import android.os.Build
import android.view.View
import com.newlink.building.common_base.base.NL_BaseActivity
import com.newlink.building.common_base.event.MessageEvent
import com.newlink.building.common_base.event.Base_SendMqttMsgEvent
import com.newlink.building.common_base.event.SetSecurityModelRequest
import com.newlink.building.common_base.event.TYPE_APP_SET_SECURITY_RESULT_FAILED
import com.newlink.building.common_base.event.TYPE_APP_SET_SECURITY_RESULT_OK
import com.newlink.building.common_base.ext.showToast
import com.newlink.building.common_base.model.bean.DeviceData
import com.newlink.building.common_base.utils.DialogUtil
import com.newlink.building.common_base.utils.logDebug
import com.newlink.building.common_base.utils.logError
import com.newlink.building.common_base.utils.logInfo
import com.newlink.building.common_base.widget.MyRadioGroup
import com.newlink.building.main.R
import com.newlink.building.main.databinding.ActivitySecurityBinding
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import java.io.Serializable // Needed for getSerializableExtra with Class type

/**
 * @Author: xiaodong (Refactored by Assistant)
 * @Date: 2024/11/1
 * @Description: 安全模式设置界面。允许用户为指定设备选择布防模式（撤防、在家、离家、夜晚）。
 * 通过 MQTT 发送请求，并根据 MQTT 响应更新 UI 并提供用户反馈。
 */
class Module_Main_SecurityModelActivityNL : NL_BaseActivity() {

    // View Binding 实例
    private lateinit var binding: ActivitySecurityBinding

    // 当前操作的设备数据
    private var deviceData: DeviceData? = null

    // 用户选择的安全模式
    private var selectedMode: Int = -1

    // 加载/等待对话框
    private val loadingDialog: Dialog by lazy {
        DialogUtil.getWaitDialog(this)
    }

    /**
     * 绑定布局文件并返回根视图。
     * @return Activity 的根视图。
     */
    override fun attachLayoutRes(): View {
        binding = ActivitySecurityBinding.inflate(layoutInflater)
        return binding.root
    }

    /**
     * 初始化数据 (当前无特定数据需在此处初始化)。
     */
    override fun initData() {
        // No specific data initialization required at the moment
    }

    /**
     * 初始化视图组件和设置监听器。
     */
    override fun initView() {
        // 安全地从 Intent 中获取 DeviceData
        deviceData = getSerializableExtra("deviceData", DeviceData::class.java)
        if (deviceData == null) {
            logInfo<Module_Main_SecurityModelActivityNL>("DeviceData is null from Intent. Finishing activity.")
            finish()
            return
        }

        setupInitialSecurityMode() // 设置初始安全模式
        setupTitleBar() // 设置标题栏
        setupRadioGroupListener() // 设置 MyRadioGroup 监听器
    }

    /**
     * 根据传入的设备数据，设置初始选中的安全模式。
     */
    private fun setupInitialSecurityMode() {
        binding.radioGroup.check(
            when (deviceData?.armingMode) {
                -1 -> R.id.rb_disarm
                0 -> R.id.rb_home
                1 -> R.id.rb_away
                2 -> R.id.rb_night
                else -> R.id.rb_disarm // 默认选择撤防
            }
        )
    }

    /**
     * 设置标题栏文本和返回按钮监听。
     */
    private fun setupTitleBar() {
        binding.titlebar.tvTitleCommon.text = resources.getString(R.string.device_security)
        binding.titlebar.imageBack.setOnClickListener {
            onBackPressed() // 返回上一级
        }
    }

    /**
     * 设置 MyRadioGroup 的选中改变监听器。
     */
    private fun setupRadioGroupListener() {
        binding.radioGroup.setOnCheckedChangeListener(object :
            MyRadioGroup.OnCheckedChangeListener {
            override fun onCheckedChanged(group: MyRadioGroup?, checkedId: Int) {
                val mode = when (checkedId) {
                    R.id.rb_disarm -> -1
                    R.id.rb_home -> 0
                    R.id.rb_away -> 1
                    R.id.rb_night -> 2
                    else -> {
                        logError<Module_Main_SecurityModelActivityNL>("Unknown checkedId: $checkedId, defaulting to -1.")
                        -1 // 未知ID，默认设置为撤防
                    }
                }

                // 显示加载对话框
                loadingDialog.show()
                selectedMode = mode // 保存用户选择的模式

                // 准备并发送 MQTT 消息
                val macAddress = deviceData?.mac.orEmpty()
                if (macAddress.isNotEmpty()) {
                    val setSecurityModelRequest = SetSecurityModelRequest(
                        data = SetSecurityModelRequest.Data(macAddress, mode)
                    )
                    EventBus.getDefault().post(Base_SendMqttMsgEvent(userId, setSecurityModelRequest))
                    logInfo<Module_Main_SecurityModelActivityNL>("Sent MQTT security mode request for MAC: $macAddress, mode: $mode")
                } else {
                    logError<Module_Main_SecurityModelActivityNL>("Device MAC address is empty, cannot send security mode request.")
                    loadingDialog.dismiss() // 隐藏加载对话框
                }
            }
        })
    }

    /**
     * 接收 EventBus 消息的回调。
     * 处理安全模式设置的结果。
     * @param event 接收到的 MessageEvent。
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    fun onEventMsgReceived(event: MessageEvent) {
        when (event.msgType) {
            TYPE_APP_SET_SECURITY_RESULT_OK -> {
                logDebug<Module_Main_SecurityModelActivityNL>("Security mode set successfully. Selected mode: $selectedMode")
                loadingDialog.dismiss() // 隐藏加载对话框
                // 刷新设备列表（如果需要）
                // EventBus.getDefault().post(MessageEvent(TYPE_HOME_REFRESH_DEVICE ,0)) // 可以取消注释以刷新首页设备列表
                showToast(getString(R.string.result_success)) // 提示设置成功

                // 返回结果给调用 Activity
                val resultIntent = Intent().apply {
                    putExtra("mSelectMode", selectedMode)
                }
                setResult(RESULT_OK, resultIntent)
                finish() // 结束当前 Activity
            }

            TYPE_APP_SET_SECURITY_RESULT_FAILED -> {
                logError<Module_Main_SecurityModelActivityNL>("Failed to set security mode.")
                loadingDialog.dismiss() // 隐藏加载对话框
                showToast(getString(R.string.result_failure)) // 提示设置失败
                // 可以在这里选择是否重新设置 RadioGroup 的选中状态到之前的状态
            }
        }
    }

    /**
     * 安全地从 Intent 中获取 Serializable 对象。
     * 处理了 API 级别差异和类型转换安全。
     *
     * @param key Intent 中数据的键。
     * @param clazz 要获取的对象的 Class 类型。
     * @return 解析后的对象，如果获取失败则为 null。
     */
    private fun <T : Serializable> getSerializableExtra(key: String, clazz: Class<T>): T? {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            intent.getSerializableExtra(key, clazz)
        } else {
            @Suppress("DEPRECATION")
            intent.getSerializableExtra(key) as? T
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        // 确保对话框在 Activity 销毁时被隐藏，防止窗口泄漏
        if (loadingDialog.isShowing) {
            loadingDialog.dismiss()
        }
    }
}